package Objetos;

import java.awt.Image;
import java.awt.Rectangle;

/**
 * Clase Elemento, contiene las descripciones de cada elementos del mapa.
 * @author Andres Garcia Amado, Federico Quattrocchio, Matias Lameiro.
 */
public class Elemento {
	
	/** Atributo x, coordenada x del elemento en el mapa.*/
	private int x;
	
	/** Atributo y, coordenada y del elemento en el mapa. */
	private int y;
	
	/** Atributo image, contrenda la imagen del elemento. */
	private Image image;
	
	/** Atributo width, ancho del elemento. */
	private int width;
	
	/** Atributo height, alto del elemto*/
	private int height;
	
	/** Atributo Visible, indica si la imagen del elemento esta visible si es verdadero o no sera visible en caso contrario. */
	private boolean visible;

	//Constructores
	//Constructores
	/**
	 * Constructor de la clase Elemento.
	 *
	 * @param x coordenada x de la posicion del elemento en el mapa.
	 * @param y coordenada y de la posicion del elemento en el mapa.
	*/
	public Elemento(int x, int y) {
		this.x = x;
		this.y = y;
	}

	////////////////////////////////////////////////////////////////////////////////
	/**
	 * Consulta el Ancho del elemento.
	 *
	 * @return width, el ancho del elemento.
	 */
	public int getWidth() {
		return width;
	}

	/**
	 * Cambia el ancho del elemento.
	 *
	 * @param width sera el nuevo ancho del elemento.
	 */
	public void setWidth(int width) {
		this.width = width;
	}

	/**
	 * Consulta el alto del elemento.
	 *
	 * @return height, el alto del elemento.
	 */
	public int getHeight() {
		return height;
	}

	/**
	 * Cambia el alto del elemento.
	 *
	 * @param height sera el nuevo alto del elemento.
	 */
	public void setHeight(int height) {
		this.height = height;
	}

	/**
	 * Chequea si el elemento es visible.
	 *
	 * @return true, si es visible y falso en caso contrario.
	 */
	public boolean isVisible() {
		return visible;
	}

	/**
	 * Cambia la visibilidad del elemento.
	 *
	 * @param visible sera la nueva visibilidad del elemento.
	 */
	public void setVisible(boolean visible) {
		this.visible = visible;
	}


	/**
	 * Consulta la coordenada x del elemento.
	 *
	 * @return x, coordenada x del elemento.
	 */
	public int getX() {
		return x;
	}
	
	/**
	 * Cambia la coordenada x del elemento.
	 *
	 * @param x sera la nueva coordenada x del elemento.
	 */
	public void setX(int x) {
		this.x = x;
	}
	
	/**
	 * Consulta la coordenada y del elemento.
	 *
	 * @return y, coordenada y del elemento.
	 */
	public int getY() {
		return y;
	}
	
	/**
	 * Cambia la coordenada y del elemento.
	 *
	 * @param y sera la nueva coordenada y del elemento.
	 */
	public void setY(int y) {
		this.y = y;
	}
	
	/**
	 * Consulta la imagen del elemento.
	 *
	 * @return image, imagen del elemento.
	 */
	public Image getImage() {
		return image;
	}
	/**
	 * Cambia la imagen del elemento.
	 *
	 * @param image nueva imagen del elemento.
	 */
	public void setImage(Image image) {
		this.image = image;
	}


	/**
	 * Consulta si coliciona por la izquierda a otro elemento.
	 *
	 * @param e elemento que se fija si lo coliciona.
	 * @return true, si coliciona por izquierda.
	 */
	public boolean isLeftCollision(Elemento e) {
		if (((this.getX() - 1) == e.getX()+e.getWidth()))
			return true;
		return false;
	}

	/**
	 * Consulta si coliciona por la derecha a otro elemento.
	 *
	 * @param e elemento que se fija si lo coliciona.
	 * @return true, si coliciona por derecha.
	 */
	public boolean isRightCollision(Elemento e) {

		if (((this.getX()+this.getWidth() + 1) == e.getX()))
			return true;
		return false;
	}


	/**
	 * Consulta si coliciona por arriba a otro elemento.
	 *
	 * @param e elemento que se fija si lo coliciona.
	 * @return true, si coliciona por arriba.
	 */
	public boolean isTopCollision(Elemento e) {
		if (((this.getY()+this.getHeight() + 1) == e.getY()))
			return true;
		return false;
	}
	
	/**
	 * Consulta si coliciona por la abajo a otro elemento.
	 *
	 * @param e elemento que se fija si lo coliciona.
	 * @return true, si coliciona por abajo.
	 */
	public boolean isBottomCollision(Elemento e) {
		if (((this.getY() - 1) == e.getY()+e.getHeight()))
			return true;
		return false;
	}
	
	/**
	 * Consulta los limites del elemento
	 *
	 * @return Rectangle, limites del elemento.
	 */
	public Rectangle getBounds() {
        return new Rectangle(getX(), getY(), getWidth(), getHeight());
    }
}
